package com.ruoyi.wlw.socket;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelId;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class DiscardServerHandler  extends ChannelInboundHandlerAdapter {
    /**
     * 在这里使用DefaultChannelGroup将每次连接的 Channel 存起来，每一个Channel 底层就是一个连接
     */
    private static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
    private static final Map map = new HashMap<String, ChannelId>();
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        /**
         * 这里就是添加了
         */
        channels.add(ctx.channel());
        /**
         * 获取每一个连接的唯一标示吧，相当于
         */
        ChannelId Id= ctx.channel().id();
        /**
         * map就不用解释了吧，这里就用 1 代替了key;正常项目的话肯定使用用户的唯一标示了
         */
        map.put("1",Id);
        /**
         * 这里只是写了个测试遍历了一下
         */
        Iterator<Channel> ls=  channels.iterator();
        while (ls.hasNext()){
            Channel l= ls.next();
            System.out.println(l.id().toString());
        }
    }

    /**
     * 下面这两个get方法是个人使用方法，不好的还希望大家给点意见
     * @return
     */
    public static ChannelGroup getChannels() {
        return channels;
    }
    public static Map getMap() {
        return map;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object  msg) throws Exception {
        ByteBuf in=(ByteBuf)msg;
        System.out.println(ctx.channel().id().toString()+"收到信息："+in.toString());

        String reMsg="66666";
        ByteBuf in2= Unpooled.copiedBuffer(reMsg.getBytes());
        ctx.writeAndFlush(in2);
//        new NettyTest01().test(null,null);

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
